package yt.demo.appcorebasic.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.JoinPoint;
import org.springframework.stereotype.Component;
import yt.demo.appcorebasic.annotation.ResultEntity;

import java.lang.reflect.Field;

@Aspect
@Component
public class AnnotationAspect {

    // 定义切点，匹配所有带有 @ResultEntity 注解的类
    @Pointcut("@within(yt.demo.appcorebasic.annotation.ResultEntity)")
    public void resultEntityClasses() {}

    // 在带有 @ResultEntity 注解的类实例方法执行前触发
    @Before("resultEntityClasses()")
    public void handleResultEntityAnnotations(JoinPoint joinPoint) throws Exception {
        // 获取目标对象（即 VO 类的实例）
        Object target = joinPoint.getTarget();
        Class<?> voClass = target.getClass();
        System.out.println("voClass = " + voClass);
        // 获取 ResultEntity 注解
        ResultEntity resultEntity = voClass.getAnnotation(ResultEntity.class);
        if (resultEntity != null) {
            // 获取对应的实体类
            Class<?> entityClass = resultEntity.value();

            // 遍历实体类的字段并将其复制到目标类中
            for (Field entityField : entityClass.getDeclaredFields()) {
                try {
                    // 查找 VO 类中的同名字段
                    Field voField = voClass.getDeclaredField(entityField.getName());
                    voField.setAccessible(true);

                    // 复制字段的值
                    entityField.setAccessible(true);
                    Object value = entityField.get(null); // 获取字段值
                    voField.set(target, value);  // 将值设置到目标类的字段
                } catch (NoSuchFieldException e) {
                    // 如果目标类没有该字段，忽略
                    continue;
                } catch (IllegalAccessException e) {
                    // 处理字段访问异常
                    e.printStackTrace();
                }
            }
        }
    }
}
